處理器為什麼需要模擬器呢?
在前面的章節我們有簡單介紹模擬器與仿真器的不同,同時也說明了根據不同的使用場景我們該如何選擇使用模擬器或者是仿真器。不過話說回來,為什麼處理器會需要模擬器呢? 主要的原因大致如下:
使用模擬器進行設計較硬體設計者來說較為快速 : 對於硬體設計者來說,透過模擬器進行分析較透過硬體描述語言進行分析要來的方便及快速,原因是硬體描述語言的模擬速度通常慢上許多 (因為硬體描述語言會將實際電路的細節描述清楚,而模擬器則會選取相應的抽象層,而不是完全照搬)。
透過模擬器可以幫助硬體設計者推估實際應用場景的速度及功耗 : 有些模擬器會去模擬實際的執行需要多少時間,會消耗多少能量等,透過這種模擬器可以更快地得知目前的設計是否符合需求。
使用模擬器可以讓軟體開發者使用 : 我們可以設想一個場景,假設你一間遊戲公司的開發者,你們在會議中決策下一代的遊戲要出在PS6上,那問題來了,我們要怎麼在PS6量產前進行開發呢 ? 其中一個方法是等到Sony提供PS6的demo機器給你們,但這樣的開發時程勢必會延後,而如果Sony可以提供PS6的模擬器讓遊戲公司在上面進行開發,則就可以讓開發時程更前進一步。
使用模擬器可以得到更細節的資訊 : 透過模擬器我們可以更細節的知道處理器在執行一個程式中的行為,例如未來會提到的"GEM5模擬器"的統計資料內包含執行過程中不同種指令的出現次數、分支預測的準確度等,這些除非有設計特別的電路去紀錄否則是很難被知道的。
結合上述四點,處理器的模擬器被廣泛應用在包含教育、科研、商業應用等領域,而我們可以再根據使用場景的不同,將模擬器分為下列種類。
模擬器的種類
功能模擬器 (Functional Simulators)
這種模擬器關注在功能正確,換句話說,功能模擬器會較為接近仿真器。而功能模擬器的特點就在於"快",由於只考慮模擬功能而不模擬例如時間或能耗,因此功能模擬器通常可以跑得比其他類型的模擬器要快,但缺點就是他們在比較細節的模擬層級會失真,也沒有辦法讓硬體設計師進行完整架構好壞的評估。功能模擬器通常使用在新增新的指令時我們要快速的驗證是否正確,編譯器編出來的指令是否能正確運行,或者是分析應用場景指令分布狀況等。
時序模擬器 (Timing Simulators)
反之,時序模擬器則關注在模擬出來的時間是否能反映實際硬體,而為了要做到這點,時序模擬器通常會模擬更多的細節,例如說不同的快取記憶體大小會影響程式的運行時間等等,所以與功能模擬器相比,時序模擬器通常慢上許多,但時序模擬器的好處在於說可以幫助硬體設計者捕捉例如每個時脈週期執行多少道指令、對外的資料傳輸量多大等用來評估架構好壞資訊。
以上的分類方式僅是一個概觀分析,實際上還有許多種類,例如說較時序模擬器更進一步模擬能耗的能耗模擬器 (power simulator)等等,而時序模擬器底下也能再根據模擬手法的不同去區分是時脈級模擬(cycle-level simulator)還是事件驅動模擬器(even-driven base simulator)等等,礙於篇幅的關係這邊先簡單帶過。
模擬器的兩難
模擬器的重點就是要好用,但是"好用"的定義對於不同的人來說也各有不同,就如同前面敘述模擬器時會區分硬體設計者、軟體開發者等角色,以硬體設計者來說當然是希望模擬器能夠反映真實硬體的好壞,所以會希望越多細節越好,而速度則不是他的主要考量;而軟體開發者可能第一步只是想知道軟體的行為是否正確等等,所以他希望越快越好,因此能耗則不是他考量的重點。所以要評價一個模擬器的好壞是相當困難的,因為可能每個使用者的需求是互斥的,做的越能反映真實通常意味著越慢。
碎碎念 : 大家覺得一個好的模擬器應該具備那些要素呢,明天開始我們會試著介紹現有支援RISC-V的模擬器並試著操作